home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 4 / Apprentice-Release4.iso / Languages / PowerMacOberon 1.2 / Source / Elems / DirElems.Mod (.txt) < prev    next >
Oberon Text  |  1995-08-22  |  3KB  |  77 lines

  1. Syntax10.Scn.Fnt
  2. StampElems
  3. Alloc
  4. 24 Nov 94
  5. Syntax10b.Scn.Fnt
  6. MODULE DirElems;    (** HM 
  7. IMPORT Viewers, Texts, TextFrames, Oberon, PopupElems, Directories;
  8.     Elem* = POINTER TO ElemDesc;
  9.     ElemDesc* = RECORD (PopupElems.ElemDesc)
  10.     END;
  11.     w: Texts.Writer;
  12. PROCEDURE ReadName (t: Texts.Text; pos: LONGINT; VAR name: ARRAY OF CHAR);
  13.     VAR r: Texts.Reader; ch, stopch: CHAR; i: INTEGER;
  14. BEGIN
  15.     Texts.OpenReader(r, t, pos); Texts.Read(r, ch); i := 0;
  16.     IF ch = '"' THEN Texts.Read(r, ch);
  17.         WHILE ~r.eot & (ch # '"') DO name[i] := ch; INC(i); Texts.Read(r, ch) END
  18.     ELSE
  19.         WHILE ~r.eot & (ch > " ") DO name[i] := ch; INC(i); Texts.Read(r, ch) END
  20.     END;
  21.     name[i] := 0X
  22. END ReadName;
  23. PROCEDURE SetDirName (e: Elem; defName: ARRAY OF CHAR);
  24.     VAR vRef, i, j: INTEGER; dirID: LONGINT; name: ARRAY 256 OF CHAR;
  25. BEGIN
  26.     IF defName = "" THEN
  27.         Directories.GetCurDir(name, vRef, dirID);
  28.         Directories.GetFullPath(vRef, dirID, name)
  29.     ELSE COPY(defName, name)
  30.     END;
  31.     i := 0; WHILE name[i] # 0X DO INC(i) END;
  32.     IF i < 32 THEN COPY(name, e.name)
  33.     ELSE e.name[31] := 0X; j := 31;
  34.         REPEAT DEC(i); DEC(j); e.name[j] := name[i] UNTIL j = 1;
  35.         e.name[0] := "*"
  36. END SetDirName;
  37. PROCEDURE Exec (e: Elem; pos: LONGINT);
  38.     VAR m: TextFrames.UpdateMsg; res: INTEGER; name: ARRAY 256 OF CHAR;
  39. BEGIN
  40.     ReadName(e.menu, pos, name);
  41.     Directories.ChangeDir(name, res);
  42.     IF res = 0 THEN
  43.         IF (name = "::") OR (name = "$") THEN name := "" END;
  44.         SetDirName(e, name);
  45.         m.id := TextFrames.replace; m.text := Texts.ElemBase(e); m.beg := Texts.ElemPos(e); m.end := m.beg + 1;
  46.         Viewers.Broadcast(m)
  47.     ELSE Texts.WriteString(w, " -- failed"); Texts.WriteLn(w); Texts.Append(Oberon.Log, w.buf)
  48. END Exec;
  49. PROCEDURE Handle* (e: Texts.Elem; VAR m: Texts.ElemMsg);
  50.     VAR e1: Elem;
  51. BEGIN
  52.     WITH e: Elem DO
  53.         WITH
  54.             m: Texts.CopyMsg DO
  55.                 NEW(e1); m.e := e1; PopupElems.Handle(e, m)
  56.         |  m: Texts.IdentifyMsg DO
  57.                 m.mod := "DirElems"; m.proc := "Alloc"
  58.         |  m: PopupElems.ExecMsg DO Exec(e, m.pos)
  59.         ELSE PopupElems.Handle(e, m)
  60.         END
  61. END Handle;
  62. PROCEDURE Alloc*;
  63.     VAR e: Elem;
  64. BEGIN
  65.     NEW(e); e.handle := Handle; Texts.new := e
  66. END Alloc;
  67. PROCEDURE Insert*;
  68.     VAR e: Elem; insert: TextFrames.InsertElemMsg;
  69. BEGIN
  70.     NEW(e); e.handle := Handle; e.small := FALSE; SetDirName(e, "");
  71.     e.menu := TextFrames.Text(""); PopupElems.MeasureMenu(e);
  72.     insert.e := e; Viewers.Broadcast(insert)
  73. END Insert;
  74. BEGIN
  75.     Texts.OpenWriter(w)
  76. END DirElems.
  77.